import router from '@/router';
import { UserModule } from './store/modules/user';
import { Message } from 'element-ui';
import { Route } from 'vue-router';
import { checkVersion, getConfigItem, checkProjectConfig } from '@/utils/tools';

// 布局框架列表
import { portalLayoutList, isIframeContent } from '@/utils/portal-util';
import { TagsViewModule } from './store/modules/tags-view';

const HOME_PAGE = getConfigItem('HOME_PAGE');

// session 验证白名单
const sessionWhiteList = ['/404', '/error', HOME_PAGE, '/systemOperations', '/versionQualityCheck'];

/**  访问权限判断
 * 1. 判断是内容部分，还是外面布局框架。
 * 2. 布局框架：不允许访问非布局框架的内容。
 *    解释：布局框架不允许嵌套在 iframe，会导致无限嵌套子页面
 * 3. iframe内容部分：不允许访问布局框架内容。
 *    解释：内容不允许在页面直接访问，直接访问会重定向到布局页
 */
router.beforeEach(async (to: Route, from: Route, next: any) => {
    console.log(from, to, '路由进入');
    // if (process.env.ENV_CONFIG !== 'local') {
    //     const isNewVersion = await checkVersion();
    //     if (!isNewVersion) {
    //         Message({ message: '系统已升级，正在刷新本地缓存，请稍候...' });
    //         window.location.reload();
    //     }
    // }
    // 1. 判断是布局框架
    if (!isIframeContent()) {
        if (!portalLayoutList.includes(to.path)) {
            // 注意：process.env.NODE_ENV === 'development'
            // 是为了调试方便，仅限开发环境使用, 允许网页直接访问 iframe 子页面
            // else 中才是正常逻辑
            // if (process.env.NODE_ENV === 'development') {
            //     await UserModule.validateSession();
            //     next();
            // } else {
            //     // 若不是布局框架，就跳转到首页去
            //     next('/');
            // }
            // session 验证
            if (sessionWhiteList.includes(to.path)) {
                // 在session白名单的，不进行检测
                next();
                return;
            }
            try {
                await UserModule.validateSession();
                next();
            } catch (e) {
                next('/error?msg=' + e);
            }
        } else if (getOpenNewPageInfo(to)) {
            // 标签页打开新页面功能
            TagsViewModule.addedDirectlyVisitedView({
                pathInfo: getOpenNewPageInfo(to),
                isActive: true,
            });

            next(to.path);
        } else if (!UserModule.loginState && to.path !== '/login') {
            // 未登录
            Message.warning('登录状态已失效，请重新登录');
            next({ path: '/login' });
        } else {
            // 登录
            next();
        }
    } else {
        // 2. 判断是 iframe 内容部分
        if (portalLayoutList.includes(to.path)) {
            // iframe 内容是布局页面，就跳转到 404 页面
            next('/404');
        } else {
            if (sessionWhiteList.includes(to.path)) {
                // 在session白名单的，不进行检测
                next();
                return;
            }
            // session 验证
            try {
                await UserModule.validateSession();
                next();
            } catch (e) {
                next('/error?msg=' + e);
            }
        }
    }
});

router.afterEach(async (to: Route) => {
    if (process.env.ENV_CONFIG !== 'local') {
        Promise.all([checkVersion(), checkProjectConfig()]).then(res => {
            if (!res[0] || !res[1]) {
                Message({ message: '系统已升级，正在刷新本地缓存，请稍候...' });
                // eslint-disable-next-line no-self-assign
                window.localStorage.removeItem('CalculateFactor'); // 清除localStorage
                window.sessionStorage.clear(); // 清除sessionStorage

                window.location.reload();
            }
        });
    }
});

/* 路由异常错误处理，尝试解析一个异步组件时发生错误，重新渲染目标页面 */
// router.onError(error => {
//     console.log(error.message, 'error.message');
//     // net::ERR_ABORTED 404 (Not Found)
//     const pattern = /chunk (\w)+ failed/g;
//     const isError = error.message.match(pattern);
//     // const targetPath = (router as any).history.pending.fullPath;
//     if (isError) {
//         console.log('----------浏览器重新从服务器请求资源,在http请求头中不会包含缓存标记。----------');
//         // router.replace(targetPath);
//         Message({ message: '系统已升级，正在刷新本地缓存，请稍候...' });
//         window.location.reload(true); // 浏览器重新从服务器请求资源,在http请求头中不会包含缓存标记。
//     }
// });

function getOpenNewPageInfo(route: Route): { path: string; title: string } {
    const newpage = route.query.newpage as string;
    const newtitle = route.query.newtitle as string;
    if (newpage && newtitle) {
        return { path: newpage, title: newtitle };
    }
}
